package com.lp.multi.lock;

import java.util.concurrent.TimeUnit;

/**
 * @author: lp
 * @create: 2021-06-27 11:35
 * @description: 八锁现象7
 * 同一个对象调用一个静态同步方法、一个普通同步方法(两把锁)，但是对应的是2把锁
 * 执行结果：
 * B:call msg
 * A:send msg
 * 原因：static synchronized 锁的对象是类对象,一个类只有一把锁,A线程先获得类对象锁，没有释放前，B线程无法获取类对象锁。phone1和
 * phone2的类对象是同一把锁。
 */
public class HLock {
    public static void main(String[] args) {
        Phone7 phone = new Phone7();

        new Thread(()->{
            phone.sendMsg();
        },"A").start();

        try {
            //主线程sleep,B线程未获取锁前，确保A线程获取了锁
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone.call();
        },"B").start();
    }
}

class Phone7{

    //static synchronized 锁的对象是类对象,一个类只有一把锁
    public static synchronized void sendMsg(){
        try {
            //sleep不会释放锁，时间到后，代码继续执行
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":"+"send msg");
    }

    //synchronized普通方法修饰，锁的是调用对象
    public  synchronized void call(){
        System.out.println(Thread.currentThread().getName()+":"+"call msg");
    }


}